iT邦幫忙

2023 iThome 鐵人賽

DAY 28
0
Software Development

Laravel專案練習-寶可夢管理系統系列 第 28

Day28:寶可夢專案-Docker練習-使用docker-compose創建容器

  • 分享至 

  • xImage
  •  

前言

前面提到過可以先創建DockerFile,在用只另去生成image然後再用一些指令可以創建容器並做一些設定。

但這裡其實有另一種方式,就是透過docker compose及sail去創建容器。

名詞解釋

  • 什麼事docker compose?

    Docker Compose 是 Docker 的一個工具,專門用於定義和運行多容器 Docker 應用程序。它允許使用者使用docker-compose.yml檔案來定義多個容器的設置和相互之間的連接,而不是逐一運行多個容器。

  • 什麼事sail

    Sail 是 Laravel 框架為 Docker 提供的輕量級指令列界面。其主要目的是為 Laravel 開發者提供一個簡單的方式來在 Docker 環境中運行 Laravel 應用程序。

創建docker.compose.yml

這裡我是直接透過sail指令去創建docker.compose.yml

php artisan sail

定義要創建的容器的一些設定…。 這樣做一次可以創建多個容器, 而且假設你要用別人的image就直接執行這個,不一定要生成dockerFile

services:
    laravel.test:
        build:
            context: ./vendor/laravel/sail/runtimes/8.2
            dockerfile: Dockerfile
            args:
                WWWGROUP: 20
                WWWUSER: 501
        image: sail-8.2/app
        extra_hosts:
            - 'host.docker.internal:host-gateway'
        ports:
            - '${APP_PORT:-80}:80'
            - '${VITE_PORT:-5173}:${VITE_PORT:-5173}'
        environment:
            # WWWUSER: '${WWWUSER}'
            LARAVEL_SAIL: 1
            XDEBUG_MODE: '${SAIL_XDEBUG_MODE:-off}'
            XDEBUG_CONFIG: '${SAIL_XDEBUG_CONFIG:-client_host=host.docker.internal}'
            IGNITION_LOCAL_SITES_PATH: '${PWD}'
            

        volumes:
            - '.:/var/www/html'
        networks:
            - sail
        depends_on:
            - mysql
    mysql:
        image: 'mysql/mysql-server:8.0'
        ports:
            - '${FORWARD_DB_PORT:-3307}:3306'
        environment:
            MYSQL_ROOT_PASSWORD: your_password
            MYSQL_ROOT_HOST: '%'
            MYSQL_DATABASE: 'pokemon'
            MYSQL_USER: 'wade'
            MYSQL_PASSWORD: your_password
            # MYSQL_ALLOW_EMPTY_PASSWORD: 1
            MYSQL_ALLOW_EMPTY_PASSWORD: 'no'
        volumes:
            - 'sail-mysql:/var/lib/mysql'
            - './vendor/laravel/sail/database/mysql/create-testing-database.sh:/docker-entrypoint-initdb.d/10-create-testing-database.sh'
        networks:
            - sail
        healthcheck:
            test:
                - CMD
                - mysqladmin
                - ping
                - '-p${DB_PASSWORD}'
            retries: 3
            timeout: 5s
networks:
    sail:
        driver: bridge
volumes:
    sail-mysql:
        driver: local

根據上面的設定,我想研究一下各自的一些功能是什麼:

yml檔設定

這裡定義了兩個服務(容器)這裡是你可以自己去定義名稱):laravel.test 和 mysql. 。

1.1 laravel.test

這個服務可能是您的 Laravel 應用程序,它具有以下設定:

  • build:

    描述如何構建 Docker 映像。它使用 Dockerfile 文件和上下文路徑來構建映像。

    • context: ./vendor/laravel/sail/runtimes/8.2
      dockerfile: Dockerfile

      這兩句話的意思是,我要在context設定的路徑中去尋找叫做Dockerfile的dockerfile

    • 這裡的 WWWUSERWWWGROUP 是在設定當你建立這個容器時,應該要使用哪個用戶和組 ID 來運行容器內的進程。

  • image:

    指定要用於容器的 Docker 映像。

  • build選項和image選項的一些使用細節:

    • 那其實簡單來說。 除非你用docker-compose up --build。不然他就不會去根據docker file建立鏡像檔
    • 如果你想要使用dockerFile去建立image建立容器,可以使用docker-compose up --build指令並在這裡設定。
  • extra_hosts:

    這個選項允許您添加額外的主機名。

    簡單來說這裡設定我可以用host.docker.internal 來訪問主機

  • ports:

    映射容器的端口到主機。例如,主機的 80 端口映射到容器的 80 端口。

  • environment:

    定義了容器內的環境變量。

  • volumes:

    前面有提到過,根據你使用的路徑,他會決定你是要用bind mount還是volume:

    我這裡是用bind mount:

    • 所以他會映射主機文件系統上的目錄或文件到容器中。

    • 映射(Mapping):

      通常指的是將主機的一個目錄或文件與容器內的一個目錄或文件相關聯,使得容器可以讀取和寫入主機上的特定目錄或文件。

  • networks:

    • 指定該服務所使用的網路。在這裡,它連接到名為 sail 的網路。
    • 這個部分其實是因為我使用laravel 的sail去創建yml檔, 所以他幫我把網路也建好了。
    • 這個sail網路在service的外部可以定義,他是如何使用哪種類型的網路連接方式(比如上一張提到的bridge…等等)
  • depends_on: 定義服務的依賴性,在這裡,laravel.test 依賴於 mysql 服務,這裡指的指示啟動順序而已,所以我這樣設定mysql會先開啟。

根據yml檔所引用的image創建容器以及一些指令

  • 創建容器

    
    docker-compose up --build  //or docker-compose up -d
    
    • d 標誌表示在後台運行,這樣你就可以在容器啟動後繼續使用終端機。
    • 但我覺得有時候不用-d這個指令他會蠻詳細的跟你說他執行了什麼,或是容器再開的過程有沒有出什麼問題。
  • 列出運行中的容器

    
    docker ps
    
    

    或使用 Docker Compose:

    
    docker-compose ps
    
    
    CONTAINER ID   IMAGE                    COMMAND                  CREATED          STATUS                    PORTS                                                  NAMES
    e2624983f461   sail-8.2/app             "start-container"        36 seconds ago   Up 33 seconds             0.0.0.0:80->80/tcp, 0.0.0.0:5173->5173/tcp, 8000/tcp   pokemon-laravel.test-1
    4bc1c45d8709   mysql/mysql-server:8.0   "/entrypoint.sh mysq…"   36 seconds ago   Up 33 seconds (healthy)   33060-33061/tcp, 0.0.0.0:3307->3306/tcp                pokemon-mysql-1
    

    這裡主要還會顯示本地主機是用哪一個port號和容器做連結,左邊的部分是主機的port號,右邊的部分是容器的port號。

  • 停止和移除容器

    如果你需要停止和移除容器,可以使用以下命令:

    使用 Docker

    
    docker stop <容器名稱或ID> docker rm <容器名稱或ID>
    or
    docker-compose down
    
    
  • 進入容器的終端機

    有時候你可能要在容器上進行一些操作,比如你使用laravel的容器,你可能要進行一些php artisan migrate… 或是composer install等等的指令,就可以進入容器的終端。

    如果你知道容器的名稱或ID,你可以使用以下命令進入容器的終端機:

    
    docker exec -it <容器名稱或ID> /bin/bash
    
    

    或者,如果容器是使用 Docker Compose 啟動的,你也可以使用服務名來進入容器:

    
    docker-compose exec <服務名> /bin/bash
    docker-compose exec laravel.test /bin/bash
    

    compose 及exec 差別:

    • docker ps 會顯示所有正在運行的容器。
    • docker-compose ps 僅顯示由特定 docker-compose.yml 文件定義的服務的容器狀態。
    • docker exec 命令允許您在一個已經運行的容器中運行命令。

小結語

這裡我都還只提到創建容器的部分,後續如果有機會應該會分享一些實際上使用docker容器跑我的專案。


上一篇
Day27 寶可夢專案-Docker練習- 容器創建、數據持久化、docker內部網路初探
下一篇
Day29:寶可夢專案-Docker練習-在AWS雲端主機使用Docker遇到的問題
系列文
Laravel專案練習-寶可夢管理系統30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言